package Login;

import emailpost.Email;
import exercise.ExerSelectDemo;
import exercise.ExerciseDemo;
import image.Images;
import user.User;

import javax.swing.*;
import javax.swing.plaf.basic.BasicButtonUI;
import javax.swing.plaf.basic.BasicPanelUI;
import java.awt.*;

public class RegisterDemo extends JFrame{
    String mailCode=new String(); // 用户接收到的验证码
    boolean mailCon=false;      // 监听是否已经通过邮箱验证并成功发送验证码
    boolean nameCon=false;      // 监听账号
    boolean passwordCon=false;  // 监听密码是否一致
    public RegisterDemo(User user) {
        Email email=new Email();

        System.out.println("跳转到注册窗口啦");
        //获取显示屏的大小
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        int sw = screenSize.width;
        int sh = screenSize.height;
        this.setTitle("欢迎来到注册系统");
        int width = 500;
        int height = 550;
        this.setBounds((sw - width) / 2, (sh - height) / 2, width, height);// 设置窗口的位置
       
        ImageIcon background = Images.bg2Img; // 背景图片
        JLabel label = new JLabel(background); // 把背景图片显示在一个标签里面
        label.setBounds(0, 0, this.getWidth(), this.getHeight()); // 把标签的大小位置设置为图片刚好填充整个面板
        JPanel imagePanel = (JPanel) this.getContentPane(); // 把内容窗格转化为JPanel，否则不能用方法setOpaque()来使内容窗格透明
        imagePanel.setOpaque(false); // 窗口透明
        this.getLayeredPane().add(label, Integer.valueOf(Integer.MIN_VALUE)); // 把背景图片添加到分层窗格的最底层作为背景

        //盒子模块
        Box nameBox = Box.createHorizontalBox();        // 用户名输入框盒子
        Box mailBox = Box.createHorizontalBox();        // 邮箱输入盒子
        Box passwordBox = Box.createHorizontalBox();    // 第一次密码输入盒子
        Box repasswordBox = Box.createHorizontalBox();  // 第二次密码输入盒子
        Box valiteBox = Box.createHorizontalBox();      // 验证码输入盒子
        Box vbox = Box.createVerticalBox();             // 纵向布局大盒子

        // 第一个输入项为用户名
        JLabel nameLabel = new JLabel("用户名 :"); //文本设计
        nameLabel.setFont(new Font("微软雅黑", Font.BOLD, 18));
        nameLabel.setForeground(new Color(0x010001)); // 设置前景色
        JTextField nameField = new JTextField(); //输入框
        nameField.setFont(new Font("黑体", Font.BOLD, 15));
        nameField.setToolTipText("用户名");
        nameField.setColumns(15);

        // 第二个输入项为邮箱
        JLabel mailLabel = new JLabel("   邮箱:"); //文本设计
        mailLabel.setFont(new Font("微软雅黑", Font.BOLD, 18));
        mailLabel.setForeground(new Color(0x010001)); // 设置前景色
        JTextField mailField = new JTextField(); //输入框
        mailField.setFont(new Font("Arial", Font.BOLD, 15));
        mailField.setToolTipText("邮箱");
        mailField.setColumns(15);

        //第三个输入项为密码
        JLabel passwordLabel = new JLabel("密    码 :");    //文本设计
        passwordLabel.setFont(new Font("微软雅黑", Font.BOLD, 18));
        passwordLabel.setForeground(new Color(0x010001)); // 设置前景色
        JPasswordField passwordFd = new JPasswordField();
        passwordFd.setFont(new Font("Arial", Font.BOLD, 15));
        passwordFd.setToolTipText("密码");// 悬停显示
        passwordFd.setColumns(15);
        // 如果使用其他回显字符，可以设置大小，但是星星不可以。。。
        passwordFd.setEchoChar('●');// 星星符号
        
        // 第四个输入项为确认密码
        
        JLabel passwordConLabel = new JLabel("确认密码:");    //文本设计
        passwordConLabel.setFont(new Font("微软雅黑", Font.BOLD, 18));
        passwordConLabel.setForeground(new Color(0x010001)); // 设置前景色
        JPasswordField passwordConFd = new JPasswordField();
        passwordConFd.setFont(new Font("Arial", Font.BOLD, 15));
        passwordConFd.setToolTipText("确认密码");// 悬停显示
        passwordConFd.setColumns(15);
         // 如果使用其他回显字符，可以设置大小，但是星星不可以。。。
        passwordConFd.setEchoChar('●');// 星星符号

        //第五个输入项为输入验证码
        JLabel validateLabel = new JLabel("   验证码:"); // 文本设计
        validateLabel.setFont(new Font("微软雅黑", Font.BOLD, 18));
        validateLabel.setForeground(new Color(0x010001)); // 设置前景色
        JTextField validateField = new JTextField(); // 输入框
        validateField.setFont(new Font("Arial", Font.BOLD, 15));
        validateField.setToolTipText("验证码");
        validateField.setColumns(15);


        // 接下来布局按钮
            // 1.一共四个按钮
        JButton registerButton = new JButton("注册");    //登录按钮
        registerButton.setToolTipText("注册");// 悬停显示
        JButton resetButton = new JButton("重置");    //重置按钮
        resetButton.setToolTipText("重置");// 悬停显示
        JButton sendMailButton = new JButton("发送验证码");    //发送验证码按钮
        sendMailButton.setToolTipText("发送验证码");// 悬停显示
        JMenu backButton = new JMenu("返回登录");    //重置按钮
        backButton.setToolTipText("返回登录");// 悬停显示

                    // 注册按钮：
        registerButton.setFont(new Font("微软雅黑", Font.BOLD, 18));
        registerButton.setForeground(Color.white); // 设置前景色
        registerButton.setBackground(new Color(0xFFA17F7F, true));
        registerButton.setDefaultCapable(true);
        registerButton.setBounds(50, this.getHeight() - 150, 120, 30); // 设置按钮位置，及按钮大小
        registerButton.setCursor(new Cursor(Cursor.HAND_CURSOR));  //鼠标手势的设置

                    //重置按钮：
        resetButton.setFont(new Font("微软雅黑", Font.BOLD, 18));
        resetButton.setForeground(Color.white); // 设置前景色
        resetButton.setBackground(new Color(0xFFA17F7F,true));
        resetButton.setDefaultCapable(true);
        resetButton.setCursor(new Cursor(Cursor.HAND_CURSOR));//鼠标手势的设置
        resetButton.setBounds(210, this.getHeight() - 150, 120, 30);

                   //发送验证码按钮
        sendMailButton.setFont(new Font("微软雅黑", Font.BOLD, 18));
        sendMailButton.setForeground(Color.white); // 设置前景色
        sendMailButton.setBackground(new Color(0xFFA17F7F,true));
        sendMailButton.setDefaultCapable(true);
        sendMailButton.setCursor(new Cursor(Cursor.HAND_CURSOR));//鼠标手势的设置
        sendMailButton.setBounds(350, this.getHeight() - 150, 120, 30);

                    //返回登录按钮：
        backButton.setFont(new Font("微软雅黑", Font.BOLD, 12));
        backButton.setForeground(Color.blue); // 设置前景色
        backButton.setBackground(new Color(0x100202));
        backButton.setUI(new BasicButtonUI());  //恢复基本视觉效果
        backButton.setBounds(5, this.getHeight() - 70, 85, 20); // 设置按钮位置，及按钮大小
        backButton.setContentAreaFilled(false); // 设置按钮透明
        backButton.setCursor(new Cursor(Cursor.HAND_CURSOR));


        /*
         分区模块布局
        */

        //小盒子，设计用户名模块
        nameBox.add(nameLabel);
        nameBox.add(Box.createHorizontalStrut(0));//插入中间盒子宽度为5，作为相邻文本的空隙
        nameBox.add(nameField);
        //设计邮件输入模块
        mailBox.add(mailLabel);
        mailBox.add(Box.createHorizontalStrut(0));//插入中间盒子宽度为5，作为相邻文本的空隙
        mailBox.add(mailField);
        //设计密码输入模块
        passwordBox.add(passwordLabel);
        passwordBox.add(Box.createHorizontalStrut(0));
        passwordBox.add(passwordFd);
       //设计密码确认模块
        repasswordBox.add(passwordConLabel);
        repasswordBox.add(Box.createHorizontalStrut(5));
        repasswordBox.add(passwordConFd);

        valiteBox.add(validateLabel);
        valiteBox.add(Box.createHorizontalStrut(5));
        valiteBox.add(validateField);

       // 设计总体输入框布局

        vbox.add(Box.createVerticalStrut(40));//插入中间盒子高度为90，作为上下文本的空隙
        vbox.add(nameBox);
        vbox.add(Box.createVerticalStrut(40));
        vbox.add(mailBox);
        vbox.add(Box.createVerticalStrut(40));
        vbox.add(passwordBox);
        vbox.add(Box.createVerticalStrut(40));
        vbox.add(repasswordBox);
        vbox.add(Box.createVerticalStrut(40));
        vbox.add(valiteBox);

        JPanel panel = new JPanel();
        panel.setUI(new BasicPanelUI());  //恢复基本视觉效果
        panel.setOpaque(false); // 面板透明
        panel.add(vbox, BorderLayout.CENTER);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.add(registerButton);
        this.add(resetButton);
        this.add(backButton);
        this.add(sendMailButton);
        this.add(panel);
        this.setVisible(true);
        this.setResizable(false);

//点击按钮的监听事件




        // 发送验证码按钮监听:
        sendMailButton.addActionListener(e -> {
            // 首先获取mailField的输入内容
            String mField=new String(mailField.getText());
            // 先判断是否为空
                 //为空就弹出警告
            if(mailField.getText().isEmpty()) {
                JOptionPane.showMessageDialog(null,"邮箱不能为空","提示",
                        JOptionPane.WARNING_MESSAGE);
            } else {
                //不为空就接着判断邮箱格式校验
                boolean isEmail=RegisterFunc.isEmail(mField);
                //如果校验通过，就发送验证码
                if(isEmail){
                    this.mailCode=email.sendEmail(mField);
                    //System.out.println("123"+mailCode);
                    JOptionPane.showMessageDialog(null,"验证码已发送至邮箱，请关注邮箱信息");
                    mailCon=true;
                } else {
                    //校验不通过就重新输入
                    JOptionPane.showMessageDialog(null,"邮箱格式有误，请重新输入","提示"
                            ,JOptionPane.WARNING_MESSAGE);
                }
            }
        });



        //注册按钮监听
         registerButton.addActionListener(e -> {
             String username=new String(nameField.getText()); // 用户名
            String pField = new String(passwordFd.getPassword()); // 密码1
            String repField = new String(passwordConFd.getPassword()); // 密码2
             String mailCodeText = new String(validateField.getText()); // 输入的验证码
             String mField=new String(mailField.getText());
    try {//先验证是否通过邮箱验证,成功发送验证码
         if(mailCon){
                     //再验证验证码是否一致，一致就判断其他输入框
                     if(this.mailCode.equals(mailCodeText)){
                       //先验证是否给文本框中输入了内容
                        if (nameField.getText().isEmpty() || pField.isEmpty() || repField.isEmpty()) {
                            // 用户名校验，不为空并且必须是5-11位数字
                             if (nameField.getText().isEmpty()||(!RegisterFunc.isUsername(username))) {
                                 if(nameField.getText().isEmpty()){
                                     JOptionPane.showMessageDialog(null, "用户名不能为空", "提示",
                                             JOptionPane.WARNING_MESSAGE);
                                 }
                                 else if(!RegisterFunc.isUsername(username)){

                                         JOptionPane.showMessageDialog(null, "用户名格式有误，请输入5-11位数字",
                                                 "提示", JOptionPane.WARNING_MESSAGE);
                                 }
                              }
                             else if (pField.isEmpty()) {
                           JOptionPane.showMessageDialog(null, "密码不能为空", "提示",
                                   JOptionPane.WARNING_MESSAGE);
                                } else {
                             JOptionPane.showMessageDialog(null, "确认密码不能为空", "提示",
                                     JOptionPane.WARNING_MESSAGE);
                                   }
                        }  else {
                                    if(RegisterFunc.Userhas(username)){
                                JOptionPane.showMessageDialog(null, "账号已存在！",
                                        "提示", JOptionPane.WARNING_MESSAGE);
                                         } else {
                                    if (!pField.equals(repField)) {
                        JOptionPane.showMessageDialog(null, "两次密码不一致", "提示",
                                JOptionPane.WARNING_MESSAGE);
                                        } else {
                                 //密码一致之后，正则判断密码格式
                                 //正则验证
                               boolean isPass=RegisterFunc.isPassword(pField);
                             if(isPass) {
                            //如果校验通过,就实现注册
                            user.setAccount(username);
                            user.setPassword(pField);
                            user.setEmail(mField);
                            //将注册信息录入后，将用户信息存入User.txt文件
                            user.saveUser(user);

                            User.saveAllUsers();
                            //完成后先关闭当前界面
                                 JOptionPane.showMessageDialog(null,
                                         "注册成功！",
                                         "提示", JOptionPane.INFORMATION_MESSAGE);
                            this.dispose();
                            //再进入选题界面
                            new LoginDemo(user);
                             } else {
                            JOptionPane.showMessageDialog(null,
                                    "密码复杂度过低，请重新设置密码6-10位并保证包含数字、大小写字母！",
                                    "警告", JOptionPane.WARNING_MESSAGE);
                                 }
                         }
                      }
                     }
                    } else {
                     // 验证码不一致时发出警告
                     JOptionPane.showMessageDialog(null, "验证码有误！", "警告", JOptionPane.WARNING_MESSAGE);
                        }
                } else {
                    // 未通过邮箱验证就直接注册时发出警告
                    JOptionPane.showMessageDialog(null, "请先通过邮箱验证！", "警告", JOptionPane.WARNING_MESSAGE);
                 }
    } catch (Exception exception) {
                JOptionPane.showMessageDialog(null, "异常", "警告", JOptionPane.WARNING_MESSAGE);
            }
});

//重置按钮监听
        resetButton.addActionListener(e -> {
            nameField.setText(null);
            mailField.setText(null);
            passwordFd.setText(null);
            passwordConFd.setText(null);
            validateField.setText(null);
        });

        //返回登录窗口按钮监听
        backButton.addActionListener(e -> {
            try {
                //就是将当前窗口释放，然后100ms后进入登录窗口
                this.dispose();
                Thread.sleep(100);
                new LoginDemo(user);
            } catch (Exception exception) {
                JOptionPane.showMessageDialog(null, "异常", "警告", JOptionPane.WARNING_MESSAGE);
            }
        });
    }

    private void init( JTextField mailField, JPasswordField passwordFd) {
    }

    public void init(int key,JTextField nameField,JTextField mailField, JPasswordField passwordFd) {

        //构建一个注册对象，并且将输入的信息存入
       /*     User user = new User();
            register.setName(nameField.getText());
            register.setId(Integer.valueOf(mailField.getText()));
            char[] p1 = passwordFd.getPassword();
            register.setPassword(new String(p1));
*/


        mailField.setText(null);//显示内容置空
        nameField.setText(null);
    }
}
